Auf der Suche nach einer Firewall, die sich ohne Informatik Studium konfigurierbar ist, bin ich auf ufw gestoßen. Ich muss sagen, ich bin schwer begeistert.
die Firewall lässt sich unter Ubuntu ganz einfach mit einen
sudo apt-get install ufw
installieren. Soll die Firewall grafisch verwaltet werden:
sudo apt-get install ufw gufw
Um ufw zu verwalten sind Root-Rechte erforderlich.
Die erste Amtshandlung sollte sein, den Dienst ssh freizuschalten. Wenn man keinen physischen Zugang zu dem Server sein, wo ufw installiert ist, hat man sonst ein wirkliches Problem. ;)
ufw allow ssh
Das funktioniert natürlich nur, wenn ssh auf dem Standardport 22 läuft. Ansonsten muss natürlich der entsprechende Port Freigeschaltet werden. In diesen Beispiel läuft ssh auf Port 9222 den ich jetzt einfach mal willkürlich gewählt habe:
ufw allow 92222/tcp
Auf meinen System habe ich da nichts geändert und mein Server läuft auf 22.
[root@server dirk]# ufw allow ssh
Rules updated
Rules updated (v6)
[root@server dirk]#
bevor die Firewall aktiviert werden kann müssen so natürlich erst mal alle wichtigen Ports freigeschaltet werden.
(Weitere Befehlsbeispiele kommen weiter unten).
Wer sich nicht sicher ist, was af dem Server unter welchem Port läuft kann das recht einfach herausfinden:
netstat -tulpn
Damit der Artikel besser lesbar bleibt, habe ich HIER mal eine Beispielausgabe abgelegt.
Ich aktiviere jetzt mal auf jeden Fall meine Firewall:
[root@server dirk]# ufw enable
Firewall is active and enabled on system startup
[root@server dirk]#
Wenn die Firewall aktiviert wird, wird diese auch automatisch bei jedem Systemstart wieder aktiviert.
um diese wieder zu deaktivieren:
[root@server dirk]# ufw disable
Firewall stopped and disabled on system startup
[root@server dirk]#
Um nachzusehen welche Regeln in der Firewall aktiv ist:
[root@server dirk]# ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 9222/tcp ALLOW IN Anywhere
[ 3] 22 (v6) ALLOW IN Anywhere (v6)
[ 4] 9222/tcp (v6) ALLOW IN Anywhere (v6)
[root@server dirk]#
Die Ausgabe ist recht informativ, aber die folgende ist besser dazu geeignet Regeln zu löschen.
[root@server dirk]# ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 22 (v6) ALLOW IN Anywhere (v6)
[root@server dirk]#
so lassen sich bequem versehentlich angelegte oder alte Regeln löschen:
[root@server dirk]# ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 9222/tcp ALLOW IN Anywhere
[ 3] 22 (v6) ALLOW IN Anywhere (v6)
[ 4] 9222/tcp (v6) ALLOW IN Anywhere (v6)
[root@server dirk]# ufw delete 4
Deleting:
allow 9222/tcp
Proceed with operation (y|n)? y
Rule deleted (v6)
[root@server dirk]# ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 9222/tcp ALLOW IN Anywhere
[ 3] 22 (v6) ALLOW IN Anywhere (v6)
[root@server dirk]#
Wichtig! bevor man weitere Regeln löscht unbedingt nochmal die Regeln auflisten lassen, da sich natürlich die laufenden Nummern ändern und man sonst versehentlich Regeln löscht, die man gerne behalten möchte.
ufw wandelt im Hintergrund die erstellten Regeln in iptables-Regelketten um. Wem interessiert, wie die umgewandelten regeln aussehen kann sich das folgendermaßen anzeigen lassen:
iptables -L
Beispielausgabe: HIER
Weitere Beispiele:
Es gibt bei ufw eine kleine Sammlung grundlegender Firewallregeln. Diese können nach folgenden Schema verwaltet werden:
ufw allow|deny|reject SERVICE
also wenn man ssh wieder deaktivieren möchte:
ufw deny ssh
Aber das würde ich jetzt nicht empfehlen! ;)
Grundsätzlich gilt folgendes Schema:
ufw allow|deny [proto <protokoll>] [from <adresse> [port <port>]] [to <addresse> [port <port>]
zum Beispiel:
ufw allow proto tcp from all to any port 443
Das sieht dann so aus:
root@server dirk]# ufw allow proto tcp from any to any port 443
Rule added
Rule added (v6)
Kontrolle ab alles so funktioniert hat:
[root@server dirk]# ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 9222/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 22 (v6) ALLOW IN Anywhere (v6)
[ 5] 443/tcp (v6) ALLOW IN Anywhere (v6)
[root@server dirk]#
So kann man festlegen, ob per default die Ports zugelassen, oder blockiert werden:
alles erlauben:
sudo ufw default allow
alles verbieten:
sudo ufw default deny
Eine Firewall zu konfigurieren ist nie so ganz trivial. Eine Hilfe bietet natürlich immer die Logdatei.
Das Logging wird folgendermaßen aktiviert:
ufw logging on
mit
ufw logging <STUFE>
kann man festlegen wie viel geloggt wird. Es gibt die Stufen, low medium und full. Wobei low die Vorgabe ist.
Die Logdatei ist unter /var/log/ufw.log zu finden.
Beim Troubleshooting empfiehlt sich ein weiteres Terminalfenster in dem ein:
tail -f /var/log/ufw.log
ufw mit Docker:
Bei meiner Arbeit mit ufw in Verbindung hat es mir einiges an Kopfschmerzen bereitet, warum die Regeln einfach nicht ziehen wollten, obwohl ich diese aus meiner Sicht richtig eingerichtet habe. Die ufw.log konnte mir da auch nicht weiterhelfen.
Nach einer umfangreicheren Recherche habe ich herausgefunden, das Docker eine eigene iptables Firewall nutzt, die die Regeln der lokal eingerichteten Firewall untergräbt.
Das lässt sich aber zum Glück recht einfach abstellen.
Diese Lösung habe ich unter Ubuntu Server getestet, sollte aber auch so oder ähnlich auch bei anderen Distributionen funktionieren.
Man bearbeitet die Datei: /etc/default/docker
dort findet sich eine Zeile:
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=true"
oder auch
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
oder
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"
Diese Zeilen können sogar, je nach dem, auskommentiert sein
Jedenfalls kommentieren wir die vorhandene Zeile aus, sollte das noch nicht so ein, und fügen einfach die folgende Zeile ein:
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"
Sollte die Zeile vorhanden aber auskommentiert sein, braucht man nur das # entfernen.
Egal wie man es anstellt, die Zeile
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"
muss vorhanden sein, und das ohne #.
Danach müssen alle Docker Container gestoppt, und der Dienst mit
service docker restart
neu gestartet werden.
Zu Schluss noch ein Screenshot von gufw worauf, ich aber nicht weiter eingehe. ;)